package com.dxf.chepter06

/**
 * trait 特质:  类似接口
 * 特质:
 * 类与类之间只支持单继承
 * 类与特质直接可以多继承
 * scala的特质中有普通字段,抽象字段,普通方法,抽象方法
 * 叫法:
 * 1 特质中只有抽象内容,这样的特质叫      瘦接口
 * 2 特质中既有内容,又又具体内容,叫       富接口
 *
 * 定义特质
 * trait 名称{
 * //普通字段
 * //抽象洗的
 * //普通方法
 * //抽象方法
 * }
 *
 * 继承特殊值
 *
 * class 类名 extents 特质1 with 特质2 with 特质3 {
 * //重写抽象方法
 * //重写抽象字段
 * //可重写普通字段和普通方法
 * }
 *
 * =============================================================
 *
 *
 * 扩展类特质
 * 特质可以继承类, 可以通过再写一个子类继承特质的功能来增强类
 * trait AA extends Exception{
 * }
 *
 *
 * class BBException extends AA{
 *
 * }
 *
 *
 * ===============================================================
 *
 * 自身类型 self type -->自己告诉编译器我是谁
 * 解决特质循环依赖问题,限制混入该特质类的类型
 *
 * trait Logger{
 * this:Exception=> //告诉编译器,我是exception,如果没有这句话,下面的getMessage不能用
 * def log():unit={
 * printLn(getMessage)
 * }
 * }
 *
 *
 *
 *
 *
 */
object T64_特质 {
  def main(args: Array[String]): Unit = {
    val logger = new ConsoleLogger()
    logger.log("111")
    val logger1 = ConsoleLogger.apply()

    logger.show()

  }


}

trait Logger {
  def log(msg: String)
}

trait Color {
  def show()
}

class ConsoleLogger extends Logger with Color {
  def log(msg: String): Unit = {
    println(msg)
  }

  override def show(): Unit = {
    println("红色")
  }
}

object ConsoleLogger {
  def apply(): ConsoleLogger = new ConsoleLogger()
}


trait Logger001 {
  //等价于  trait Logger001 extents Exception, 要求混入的特质类也是Exception子类
  this: Exception => //告诉编译器,我是exception,如果没有这句话,下面的getMessage不能用
  def log() = {
    println(getMessage)
  }
}

//要求自身类型是Exception子类 因为   this: Exception =>  自身类型语法说明必须是Exception子类
//Illegal inheritance, self-type Console does not conform to Exception
/*class Console extends Logger001{

}*/

class Console extends Exception with Logger001 {

}